﻿// 0910train02.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
#include <limits>
#include <iomanip>
#include <unordered_map>
#include <unordered_set>

using namespace std;

/*
如果某顾客是某一秒内最早时刻下单的顾客（可能是多个人），则可以获取免单

输入描述
输入为 n 行数据，每一行表示一位顾客的下单时间
以（年-月-日 时-分-秒.毫秒） yyyy-MM-dd HH:mm:ss.fff 形式给出

输出描述
输出一个整数，表示有多少顾客可以获取免单。

输入
3
2019-01-01 00:00:00.001
2019-01-01 00:00:00.002
2019-01-01 00:00:00.003
输出
1
 */
class Solution01
{
public:
    Solution01(vector<string>&str_vec)
    {
        unordered_map<string, vector<int>>statistic_map;

        for (auto&str:str_vec)
        {
            if (str.find('.')!=string::npos)
            {
                int pos = str.find('.');
                string key = str.substr(0, pos);
                string val = str.substr(pos + 1);

                statistic_map[key].push_back(stoi(val));
            }
        }

        long long result = 0;
        for (auto&map_item:statistic_map)
        {
            long long count = 0;
            vector<int>sort_v = map_item.second;
            sort(sort_v.begin(), sort_v.end());

            int min_num = sort_v[0];
            for (auto&num:sort_v)
            {
                if (num == min_num)count += 1;
            }

            result += count;
        }

        cout << result;
        //Solution01
    }
};


/*
公司组织了一次考试，现在考试结果出来了，想看一下有没人存在作弊行为，
需要先对员工进行一次过滤，再进一步确定是否存在作弊行为
过滤的规则为：找到分差最小的员工ID对(p1,p2)列表，要求p1<p2
员工个数取值范围: 0<n<100000
员工ID为整数，取值范围: 0<=n<=100000
考试成绩为整数，取值范围: 0<=score<=300

输入描述
员工的ID及考试分数

输出描述
分差最小的员工ID对(p1,p2)列表，要求p1<p2。每一行代表一个集合，
每个集合内的员工ID按顺序排列，多行结果也以员工对中p1值大小升序排列(如果p1相同则p2升序)

输入
5
1 90
2 91
3 95
4 96
5 100
输出
1 2
3 4

输入：第一行为员工个数n，后续的n行第一个数值为员工ID,第二个数值为员工考试分数
输出:员工1和员工2的分差为1，员工3和员工4的分差也为1，因此最终结果为
1 2
3 4
 */
class Solution02
{
public:
    Solution02(vector<vector<int>>&num_vec)
    {
        //0序号 1分数
        sort(num_vec.begin(), num_vec.end(), [](vector<int>&vec_1,vector<int>&vec_2)
            {
                if (vec_1[1]==vec_2[1])
                {
                    return vec_1[0] < vec_2[0];
                }
                return vec_1[1] < vec_2[1];
            });

        int min_diff = INT_MAX;
        unordered_map<int, vector<vector<int>>>diff_map;
        for (int i=0; i<num_vec.size(); i++)
        {
            for (int next=i+1; next<num_vec.size(); next++)
            {
                int curr_diff = num_vec[next][1] - num_vec[i][1];
                min_diff = min(min_diff, curr_diff);

                vector<int>index_v = { num_vec[i][0], num_vec[next][0] };
                sort(index_v.begin(), index_v.end(), [](int i_1, int i_2)
                    {
                        return i_1 < i_2;
                    });
                diff_map[curr_diff].push_back(index_v);
            }
        }

        vector<vector<int>>result = diff_map[min_diff];

        sort(result.begin(), result.end(), [](vector<int>&vec_1, vector<int>&vec_2)
            {
                //如果p1相同则p2升序
		        if (vec_1[0]==vec_2[0])
		        {
		            return vec_1[1] < vec_2[1];
		        }
		        return vec_1[0] < vec_2[0];
            });

        for (auto&index_v:result)
        {
            cout << index_v[0] << ' ' << index_v[1] << endl;
        }

        //Solution02
    }
};


int main()
{
	{
        int v_size;
        cin >> v_size;
        cin.ignore();

        vector<vector<int>>num_vec(v_size);
        for (int i=0; i<v_size; i++)
        {
            vector<int>min_vec(2);
            cin >> min_vec[0] >> min_vec[1];
            num_vec[i] = min_vec;
        }

        Solution02 solu(num_vec);
        return 0;
	}
    int v_size;
    cin >> v_size;
    cin.ignore();
    vector<string>str_vec(v_size);
    for (int i=0; i<v_size; i++)
    {
        string input;
        getline(cin, input);
        str_vec[i] = input;
    }
    Solution01 solu(str_vec);

}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
